package com.itheima.ioc.service.impl;

import com.itheima.ioc.dao.UserDao;
import com.itheima.ioc.dao.impl.UserDaoImpl;
import com.itheima.ioc.dao.impl.UserDaoImpl2;
import com.itheima.ioc.service.UserService;
import com.itheima.ioc.util.BeanFactory;
import com.itheima.ioc.util.UnfinishedBeanFactory;
import org.junit.Test;

import java.util.ResourceBundle;

public class UserServiceImpl implements UserService {

    @Test
    @Override
    public void add() throws Exception {
        //1. 主动创建对象
        //存在的问题：1.代码耦合：UserServiceImpl#add()实现依赖于UserDaoImpl，我们就说
        //UserServiceImpl与UserDaoImpl存在耦合
        //问题2：如果UserDao接口的方法做了另外一套实现，那么也需要改动代码
//        UserDaoImpl userDao = new UserDaoImpl();
//        UserDaoImpl2 userDao2=new UserDaoImpl2();

//        2. 面向接口编程 : 解耦(一定程度的解耦)
        //思考：UserDao userDao = new UserDaoImpl()只有当前方法使用么？
        //答案：显然不是，会构建很多构建userDao的方法
        //核心思路：把共性代码提取到一个工具类中，而这段代码仅仅只有生成对象，所以这个工具类可
        //称为工厂类
//        UserDao userDao = new UserDaoImpl();
//        UserDao userDao = new UserDaoImpl2();

        //3.构建userDao对象的方法封装到统一工厂中：解耦服务对象与dao对象
//        UserDao userDao= (UserDao) UnfinishedBeanFactory.getBean("userDao");

//        4. 反射 + 配置文件 : 进一步解耦
//        ResourceBundle bundle = ResourceBundle.getBundle("data");
//        String userDaoClassName = bundle.getString("userDao");
//        Class<?> clazz = Class.forName(userDaoClassName);
//        UserDao userDao = (UserDao) clazz.newInstance();

        //5. 工厂模式 : 统一管理bean的创建
        //工厂类+反射+配置文件实现最大程度的解耦
        //思路：
        //1.工厂类不要反复构建对象，尽量让构建好的对象增强复用性，好处：节约内存，且响应速度提升
            //如何提高工厂生产的对象的复用性？对象池----》IOC容器
        //2.将工厂生产的对象通过静态资源配置后，好处：1.解耦了工厂与资源的耦合 2.避免因资源的调整而反复编译工厂的问题，提高了可维护性
        UserDao userDao = (UserDao) BeanFactory.getBean("userDao");
        userDao.addUser();
    }
}
